Servlet 技术(一) --基本介绍和接口使用

Servlet简介

Servle就是一种实现了Servlet接口的类,由Web容器负责创建并调用,用于接收和响应用户的请求

Servlet接口

Servlet接口中定义了5个抽象的方法,具体如下表所示

方法声明 功能描述
void init(ServletConfig config) 负责Servlet初始化工作,容器在创建好Servlet对象后,就会调用此方法
ServletConfig getServletConfig() 返回容器调用 init(ServletConfig config) 方法传递给Servlet的Servlet对象
String getServletInfo() 返回一个字符串,其中包含了关于Servlet的信息,例如,作者,版本和版权等信息
void service(ServletRequest request, ServletResponse response) 负责响应用户的请求,当容器接收到客户段访问Servlet对象的请求时,就会调用此方法
void destroy() 负责释放Servlet对象占用的资源,当Servlet对象被销毁时,容器就会调用此方法

其中init,service,destroy是Servlet生命周期方法

Servlet生命周期

如下图所示:
Servlet生命周期

Servlet的生命周期可以分为三个阶段

初始化阶段

当客户端向Servlet容器发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Serlvet对象,如果有直接使用该Serlvet对象,如果没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。

运行阶段

这是Servlet生命周期中最重要的阶段,在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,service()方法在Servlet的整个生命周期中会被调用多次。

销毁阶段

当服务器关闭或web应用被移除出容器时,Serlvet随着web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。需要注意的是,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁

主要实例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("初始化执行!");
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
System.out.println("销毁执行!");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();
out.println("Hello World!");
System.out.println("Hello World!");
out.close();
}

To be continue……

HttpServlet主要功能

  • 根据用户请求方式的不同,定义相应的doXxx()方法处理用户请求,例如,与GET请求方式对应的doGet()方法,与POST方式对应的doPost()方法。
  • 通过service()方法将HTTP请求和响应分别转为HttpServletRequest和HttpServletResponse类型的对象

一般情况下我们就直接继承HttpServlet然后覆盖HttpServelet中的doGet()和doPost()方法就可以了,这里不多加赘述,这是基本的,重复的最多的步骤了

Servlet虚拟路径的映射

在web.xml文件中,一个元素用于映射一个Servlet的对外访问路径,该路径也称为虚拟路径。创建好的Servlet只有映射成虚拟路径,客户端才能对其进行访问

Servlet的多重映射

Servlet的多重映射指的是同一个Servlet可以被映射成多个虚拟路径。它的实现方式有两种,具体如下:

  1. 配置多个元素
  2. 在一个元素下配置多个子元素

Servlet映射路径中使用通配符

若希望某个目录下的所有路径都可以访问同一个Servlet,这时,可以在Servlet映射的路径中使用通配符“*”。通配符的格式只有两种:

  1. 格式为“.扩展名”。 例如“.do”匹配以“.do”结尾的所有URL地址。
  2. 格式为“/”,例如“/abc/”匹配以“/abc”开始的所有URL地址。

缺省Servlet

  • 如果某个Servlet的映射路径仅仅是一个正斜线(/),那么这个Servlet就是当前Web应用的缺省Servlet。
  • Servlet服务器在接收到访问请求时,如果在web.xml文件中找不到匹配的元素的URL,就会将访问请求交给缺省Servlet处理,也就是说,缺省Servlet用于处理其他Servlet都不处理的访问请求。

ServletConfig接口

**ServletConfig定义了一系列获取配置信息的方法,如下表所示

方法说明 功能描述
String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames() 返回一个Enumeration对象,其中包含了所有的初始化参数名
ServletContext getServletContext() 返回一个代表当前Web应用的ServletContext对象
String getServletName() 返回Servlet名字,即web.xml中元素的值

先以getInitParameter()方法为例,分步讲解该方法的使用(如果不明白web.xml文档的作用请看web.xml文件

  1. 在web.xml文件中做如下配置
    ServletConfig配置
  2. 编写TestServlet类,实现读取web.xml文件中的参数信息(主要代码如下)
    1
    2
    3
    4
    5
    6
    7
    8
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    PrintWriter out = response.getWriter();
    ServletConfig config = this.getServletConfig();
    String param = config.getInitParameter("encoding");
    out.println("encoding="+param);
    out.close();
    }

ServletContext接口

获取Web应用程序的初始化参数

  1. 在web.xml文件中配置初始化信息如下
    ServletContext配置
  2. 通过编写程序实现获取Web应用程序的初始化参数
    1
    2
    3
    4
    5
    6
    7
    8
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    PrintWriter out = response.getWriter();
    ServletConfig config = this.getServletConfig();
    String param = config.getInitParameter("encoding");
    out.println("encoding="+param);
    out.close();
    }

实现多个Servlet对象共享数据

提供了许多操作属性的方法,如下所示

方法说明 功能描述
Enumeration getAttributeNames() 返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的所有属性域名
Object getAttribute(String name) 根据参数指定的属性名返回一个与之匹配的域属性值
void removeAttribute(String name) 根据参数制定的域属性名,从ServletContext中删除匹配的域属性
void setAttribute(String name, Object) 设置ServletContext的域属性,其中name是域属性名,obj是域属性值

在此只说思路,具体代码实现就不写了

  1. 创建一个sevlet1,获得ServeltContext对象后用setAttribute方法设置一个值
  2. 创建一个servlet2,调用 getAttribute方法得到一个值,然后用PrintWrite对象输出
  3. 启动服务器,先访问servlet1,然后访问servlet2,于是得到结果

读取Web应用下的资源文件

用于获取资源路径的方法如下所示
ServletContext使用

  1. 创建在src目录下创建一个名成为data.properties文件
  2. 在创建好的文件中输入配置信息如下所示

    Company=Qingdao University of Science and Technology
    Address=Qingdao
    千万注意的是等号左右不要有空格

  3. 编写读取关键代码如下所示:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    ServletContext context = this.getServletContext();
    PrintWriter out = response.getWriter();
    InputStream in = context.getResourceAsStream("/WEB-INF/classes/data.properties");
    Properties pros = new Properties();
    pros.load(in);
    out.println("Company=" + pros.getProperty("Company") + "<br/>");
    out.println("Address=" + pros.getProperty("Address") + "<br/>");
    out.close();
    }

获取资源的绝对路径

暂时还没有发现这个方法有什么绝妙的地方(感觉有些多此一举),爱~,经验不够,继续努力,以后在来补充,先将基本实现代码附上如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
ServletContext context = this.getServletContext();
PrintWriter out = response.getWriter();
String path = context.getRealPath("/WEB-INF/classes/data.properties");
InputStream in = new FileInputStream(path);
Properties pros = new Properties();
pros.load(in);
out.println("Company=" + pros.getProperty("Company") + "<br/>");
out.println("Address=" + pros.getProperty("Address") + "<br/>");
out.println("RealPath:" + path);
out.close();
}
`

结果如下所示

Company=qingdao University of Science and Technology
Address=qingdao
RealPath:F:\WebProject\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\test1\WEB-INF\classes\data.properties 

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器